WEB3 Day3-Solidity基础[part2]

WEB3 Day3 — Solidity基础[part2]

存储位置

solidity里面有六种存储位置。

  1. Calldata
  2. Memory
  3. Storage
  4. Stack
  5. Code
  6. Logs

calldata和memory是函数执行期间变量的临时存储位置,calldata只读,用于不可修改的函数输入。

相比之下,memory允许读写访问,使变量能在函数内部被修改。

要修改calldata变量,必须先讲它们加载到memory中。

Calldata

只读的, 比storage更经济,主要用于输入。

下面函数中_name 用calldata关键字,就会收到错误提示,因为不可修改。

img

Memory

可读可修改,大多数的变量默认自动使用memory,但是字符串不能默认,需要明确指定memory或者calldata

string memory variableName = "someValue";

下面会讲到为什么会这么特殊

storage

存储在storage的变量在区块链上是持久化的,其值在函数调用和交易之间保持不变。

比如下面这个变量 favoriteNumber ,声明在函数外部,会被隐式转换为存储变量。

contract MyContract {
    uint256 favoriteNumber; // this is a storage variable
};

⚠️ 同理,在函数内部也不能使用storage,因为函数中的变量都是临时存在。

字符串和基本类型的特殊存储

在Solidity中,string是字节数据,arrays of bytes,在上文中提过需要指定确切的存储位置;

另一方面,uint256基本类型有内置机制,用于规定它们的存储、访问和操作方式及位置。

所以,在函数给uint256指定关键字就会报错

img

mapping类型

遍历过于消耗资源,所以我们使用mapping结构

mapping (string => uint256) public nameToFavoriteNumber;

🧑‍💻 Test yourself

  1. 📕 How does the Solidity compiler handle primitive types and strings in terms of memory management?
  2. 📕 Why can’t the storage keyword be used for variables inside a function?
  3. 🧑‍💻 Write a smart contract that uses storage, memory and calldata keywords for its variables.